using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._ObstructionIdentificationSurfaces
{
    /// <summary>
    /// <para>ICAO Annex 4</para>
    /// <para>Creates obstruction identification surfaces (OIS) based on the ICAO Annex 4 specification for the Precision Approach Terrain chart.</para>
    /// <para>根据国际民航组织附件 4 规范的精确进近地形图创建障碍物识别面 （OIS）。</para>
    /// </summary>    
    [DisplayName("ICAO Annex 4")]
    public class ICAOAnnex4 : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ICAOAnnex4()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// </param>
        /// <param name="_target">
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// </param>
        public ICAOAnnex4(object _in_features, object _target)
        {
            this._in_features = _in_features;
            this._target = _target;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "ICAO Annex 4";

        public override string CallName => "aviation.ICAOAnnex4";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_in_features, _target, _runway_direction.GetGPValue(), _length, _width, _slope, _height, _derived_outfeatureclass, _airport_control_point_feature_class];

        /// <summary>
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Runway Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Target OIS Features</para>
        /// <para>The target feature class that will contain the generated obstruction identification surfaces.</para>
        /// <para>将包含生成的障碍物识别表面的目标要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _target { get; set; }


        /// <summary>
        /// <para>Runway Direction</para>
        /// <para><xdoc>
        ///   <para>Specifies at which end of the runway the approach surface will be created.</para>
        ///   <bulletList>
        ///     <bullet_item>High end to low end—The approach surface will be created at the high end of the runway to the low end. If a displaced threshold point exists at the high end of the runway, that point will be honored when creating the OIS.</bullet_item><para/>
        ///     <bullet_item>Low end to high end—The approach surface will be created at the low end of the runway to the high end. If a displaced threshold point exists at the low end of the runway, that point will be honored when creating the OIS.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将在跑道的哪一端创建进近面。</para>
        ///   <bulletList>
        ///     <bullet_item>从高端到低端 - 进近曲面将在跑道的高端到低端创建。如果跑道的高端存在位移阈值点，则在创建 OIS 时将遵循该点。</bullet_item><para/>
        ///     <bullet_item>从低端到高端 - 进近曲面将在跑道的低端创建到高端。如果跑道的低端存在位移阈值点，则在创建 OIS 时将遵循该点。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Runway Direction")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _runway_direction_value? _runway_direction { get; set; } = null;

        public enum _runway_direction_value
        {
            /// <summary>
            /// <para>High end to low end</para>
            /// <para>High end to low end—The approach surface will be created at the high end of the runway to the low end. If a displaced threshold point exists at the high end of the runway, that point will be honored when creating the OIS.</para>
            /// <para>从高端到低端 - 进近曲面将在跑道的高端到低端创建。如果跑道的高端存在位移阈值点，则在创建 OIS 时将遵循该点。</para>
            /// </summary>
            [Description("High end to low end")]
            [GPEnumValue("HIGH_END_TO_LOW_END")]
            _HIGH_END_TO_LOW_END,

            /// <summary>
            /// <para>Low end to high end</para>
            /// <para>Low end to high end—The approach surface will be created at the low end of the runway to the high end. If a displaced threshold point exists at the low end of the runway, that point will be honored when creating the OIS.</para>
            /// <para>从低端到高端 - 进近曲面将在跑道的低端创建到高端。如果跑道的低端存在位移阈值点，则在创建 OIS 时将遵循该点。</para>
            /// </summary>
            [Description("Low end to high end")]
            [GPEnumValue("LOW_END_TO_HIGH_END")]
            _LOW_END_TO_HIGH_END,

        }

        /// <summary>
        /// <para>Length</para>
        /// <para>The length of the surface in meters. The default value is 900.</para>
        /// <para>表面的长度（以米为单位）。默认值为 900。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Length")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _length { get; set; } = 900;


        /// <summary>
        /// <para>Width</para>
        /// <para>The width of the surface in meters. The default value is 120.</para>
        /// <para>表面的宽度（以米为单位）。默认值为 120。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Width")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _width { get; set; } = 120;


        /// <summary>
        /// <para>Slope</para>
        /// <para>The slope of the surface in degrees. The default value is 3.</para>
        /// <para>曲面的坡度（以度为单位）。默认值为 3。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Slope")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _slope { get; set; } = 3;


        /// <summary>
        /// <para>Start Height</para>
        /// <para>The start height of the surface in meters. The default value is 15.24.</para>
        /// <para>曲面的起始高度（以米为单位）。默认值为 15.24。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start Height")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _height { get; set; } = 15.24;


        /// <summary>
        /// <para>Output OIS Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _derived_outfeatureclass { get; set; }


        /// <summary>
        /// <para>Input Airport Control Point Feature</para>
        /// <para>Supplies x-, y-, and z-geometry for displaced threshold features. If displaced thresholds are included, surfaces will be constructed based on their x-, y-, and z-geometry instead of their corresponding runway feature endpoint.</para>
        /// <para>为位移阈值特征提供 x、y 和 z 几何。如果包含位移阈值，则将基于其 x、y 和 z 几何构建表面，而不是其相应的跑道要素端点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Airport Control Point Feature")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _airport_control_point_feature_class { get; set; } = null;


        public ICAOAnnex4 SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}